/*
  spr-sdk: Statistical Pattern Recognition SDK
  Copyright (C) 2010 Marco Ambu

  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef _PR_NEARESTNEIGHBORCLASSIFIER_H
#define _PR_NEARESTNEIGHBORCLASSIFIER_H

#include "util/Real.h"
#include "pr/Classifier.h"

namespace pr {

class NearestNeighborClassifier : public Classifier
{
public:
  NearestNeighborClassifier(std::size_t numClasses, std::size_t numFeatures, unsigned int k_par = 1);

  virtual std::size_t classCount() const { return numClasses_; }
  virtual std::size_t featureCount() const { return numFeatures_; }

  virtual void train(const Pattern& trainingPattern, std::size_t classId);
  virtual std::size_t classify(const Pattern& testPattern);
  virtual bool test(const Pattern& testPattern, std::size_t classId);
  virtual bool rank(const Pattern& testPattern, std::size_t classId, std::size_t rank);

//    void distvector(pvector& pv, pvector& dist);

//    unsigned int nn(pvector& pv);        // Number of the Nearest neighbor in the training set
//    util::Real dfnn(pvector& pv);              // Distance from nearest neighbor

//    bool rank(tsvector& pv, unsigned int r);
private:
  std::size_t numClasses_;
  std::size_t numFeatures_;
  unsigned int parameterK_;
  std::vector<std::pair<Pattern, std::size_t> > trainingPatterns_;
};

} // namespace pr

#endif // _PR_NEARESTNEIGHBORCLASSIFIER_H
